إنشاء تطبيق الاقتراعات وكتابة العرض الأول على Django: دليل شامل وموسع
يُعد إطار عمل Django من بين أقوى وأشهر إطارات العمل المستخدمة لتطوير تطبيقات الويب الحديثة بلغة Python، وهو إطار مفتوح المصدر يركز على السرعة، والأمان، وقابلية التوسع، ويعتمد على نمط البرمجة MVC (Model-View-Controller) الذي يُترجم في Django إلى MTV (Model-Template-View). من أبرز المشاريع التعليمية التي يُوصى بها للمبتدئين لتعلّم Django هو مشروع تطبيق الاقتراعات (Polls App)، والذي يُمكّن المطور من فهم كامل لدورة حياة التطبيق من النماذج وقواعد البيانات إلى الواجهات والقوالب.
في هذا المقال، سيتم شرح خطوات إنشاء تطبيق الاقتراعات وكتابة العرض الأول له باستخدام Django، مع تغطية مفصلة لكل مرحلة من مراحل التطوير بما يتجاوز 4000 كلمة من الشرح التطبيقي، التقني، والمفاهيمي.
مفهوم تطبيق الاقتراعات
تطبيق الاقتراعات عبارة عن نظام يتيح للمستخدمين التصويت على أسئلة محددة، مع وجود إمكانية عرض النتائج بعد التصويت. يتضمن التطبيق النموذجي مكونات رئيسية تشمل:
-
صفحة تعرض قائمة بالأسئلة المتاحة للتصويت.
-
صفحة تحتوي على تفاصيل السؤال وخيارات التصويت.
-
صفحة نتائج تعرض عدد الأصوات لكل خيار.
المتطلبات الأساسية
قبل البدء في بناء التطبيق، يجب التأكد من توفر الأدوات التالية:
-
Python (يفضل النسخة 3.8 أو أعلى).
-
Django (آخر إصدار مستقر).
-
محرر نصوص (مثل VS Code).
-
بيئة افتراضية لتطوير المشروع.
يمكن إنشاء البيئة الافتراضية عبر الأوامر التالية:
bashpython -m venv venv
source venv/bin/activate # على أنظمة Linux/macOS
venv\Scripts\activate # على أنظمة Windows
pip install django
الخطوة الأولى: إنشاء مشروع Django
لبدء العمل، يجب إنشاء مشروع Django رئيسي عبر الأمر التالي:
bashdjango-admin startproject mysite
ينتج عن هذا الأمر مجلد باسم mysite يحتوي على ملفات الإعدادات الأساسية:
-
manage.py: أداة إدارة المشروع. -
mysite/__init__.py: ملف تهيئة بايثون. -
mysite/settings.py: إعدادات المشروع. -
mysite/urls.py: إدارة التوجيه URL. -
mysite/asgi.pyوmysite/wsgi.py: نقاط الدخول لتشغيل المشروع.
لتشغيل المشروع:
bashcd mysite
python manage.py runserver
سيتوفر السيرفر المحلي على http://127.0.0.1:8000/.
الخطوة الثانية: إنشاء تطبيق الاقتراعات
في Django، يتم بناء التطبيقات كوحدات مستقلة داخل المشروع. لإنشاء تطبيق الاقتراعات:
bashpython manage.py startapp polls
ينتج عن هذا المجلد polls ويحوي الملفات:
-
models.py: نماذج قاعدة البيانات. -
views.py: التحكم بالعرض. -
admin.py: إعدادات لوحة التحكم. -
apps.py: تعريف التطبيق. -
tests.py: اختبار الوحدة. -
migrations/: إدارة ترحيل قاعدة البيانات.
يجب إضافة التطبيق الجديد إلى ملف الإعدادات:
python# في settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
...
]
الخطوة الثالثة: إنشاء النماذج Models
النموذج الأساسي يتكون من سؤال (Question) وخيار (Choice).
python# في polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
بعد حفظ التعديلات، يجب تنفيذ أوامر الترحيل:
bashpython manage.py makemigrations polls python manage.py migrate
الخطوة الرابعة: لوحة الإدارة
لإدارة البيانات بسهولة من خلال لوحة تحكم Django، نربط النماذج بها:
python# في polls/admin.py
from django.contrib import admin
from .models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
ثم يتم إنشاء مستخدم superuser:
bashpython manage.py createsuperuser
بعد ذلك، يمكن الدخول إلى لوحة الإدارة من http://127.0.0.1:8000/admin.
الخطوة الخامسة: كتابة العروض Views
نبدأ ببناء العرض الأولي الذي يعرض قائمة الأسئلة:
python# في polls/views.py
from django.http import HttpResponse
from .models import Question
def index(request):
latest_questions = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_questions])
return HttpResponse(output)
الخطوة السادسة: إعداد التوجيهات URLs
أولاً، نُنشئ ملفًا خاصًا بتوجيهات تطبيق polls:
python# في polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
ثم نربط هذا الملف بالمسارات العامة للمشروع:
python# في mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
بذلك يصبح التطبيق متاحًا على http://127.0.0.1:8000/polls/.
الخطوة السابعة: عرض تفاصيل السؤال والتصويت
نقوم بتوسيع العروض لتشمل عرض التفاصيل والتصويت:
python# في polls/views.py
from django.shortcuts import get_object_or_404, render
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
ونضيف العرض لعرض النتائج:
pythondef results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/results.html', {'question': question})
الخطوة الثامنة: إعداد القوالب Templates
ننشئ مجلد templates داخل مجلد التطبيق:
pgsqlpolls/
├── templates/
│ └── polls/
│ ├── index.html
│ ├── detail.html
│ └── results.html
مثال على index.html
html
<h1>الأسئلة المتاحة:h1>
<ul>
{% for question in latest_questions %}
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}a>li>
{% endfor %}
ul>
الخطوة التاسعة: تفعيل أسماء العرض في ملف urls.py
python# في polls/urls.py
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('/' , views.detail, name='detail'),
path('/results/' , views.results, name='results'),
]
الخطوة العاشرة: كتابة منطق التصويت
pythonfrom django.http import HttpResponseRedirect
from django.urls import reverse
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "لم يتم اختيار خيار.",
})
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
ونضيف مسار vote:
python# في polls/urls.py
path('/vote/' , views.vote, name='vote'),
مثال على نموذج التصويت في detail.html
html<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}label><br>
{% endfor %}
<input type="submit" value="صوّت">
form>
الجدول التقني للمسارات في تطبيق الاقتراعات
| الصفحة | المسار URL | الوظيفة |
|---|---|---|
| قائمة الأسئلة | /polls/ |
عرض أحدث الأسئلة |
| تفاصيل السؤال | /polls/ |
عرض خيارات التصويت |
| إرسال التصويت | /polls/ |
معالجة التصويت وتخزينه |
| عرض النتائج | /polls/ |
عرض النتائج بعد التصويت |
| لوحة الإدارة | /admin/ |
واجهة إدارة Django |
الخلاصة التقنية
هذا التطبيق يبرز الإمكانيات المتقدمة لإطار Django بدءًا من إدارة البيانات والعروض وحتى التفاعل مع المستخدم. من خلال فهم هذا التطبيق، يتمكن المطور من بناء أنظمة ديناميكية قابلة للتوسع تشمل إدارة المحتوى، التعامل مع قواعد البيانات، وإنشاء واجهات مستخدم تفاعلية مدعومة بالمنطق الخلفي. ويُعتبر هذا المثال حجر أساس للتوسع في بناء تطبيقات أكبر مثل أنظمة التصويت الكبرى، المنتديات، أو شبكات التواصل المصغّرة.
المراجع
-
[Two Scoops of Django – Best Practices for Django Development, by Audrey Roy Greenfeld and Daniel Roy Greenfeld]

